package com.xinggq.pay.service.pay.channel.yse.pay.common;

import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.xinggq.pay.service.entity.YsePayConfigEntity;
import com.xinggq.pay.service.pay.channel.yse.enums.YseMethodEnum;
import com.xinggq.pay.service.pay.channel.yse.utils.YseUtil;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 支付公共参数配置
 * </p>
 *
 * @author qth
 * @since 2023-10-08
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class YsePayCommonDTO implements Serializable {

  @Serial
  private static final long serialVersionUID = 1L;
  /**
   * 方法
   */
  @JsonProperty("method")
  private String method;

  /**
   * 在银盛支付开设的服务商商户号，请联系客户经理提供
   */
  @JsonProperty("partner_id")
  private String partnerId;

  /**
   * 商户网站使用的编码格式，如UTF-8、GBK、GB2312等，默认值 GBK
   */
  @JsonProperty("charset")
  private String charset;

  /**
   * 报文签名算法，RSA 、SM
   */
  @JsonProperty("sign_type")
  private String signType;

  /**
   * 交易成功异步通知到商户的后台地址
   */
  @JsonProperty("notify_url")
  private String notifyUrl;

  /**
   * 版本号3.0/3.4/3.5 当前版本3.5
   */
  @JsonProperty("version")
  private String version;

  /**
   * 前台跳转）同步通知地址
   */
  @JsonProperty("return_url")
  private String returnUrl;

  /**
   * 业务请求参数合集
   */
  @JsonProperty("biz_content")
  private String bizContent;
  /**
   * 签名
   */
  @JsonProperty("sign")
  private String sign;
  /**
   * 发送请求的时间，格式"yyyy-MM-dd HH:mm:ss" 2014-07-24 03:07:50
   */
  @JsonProperty("timestamp")
  private String timestamp;


  public static YsePayCommonDTO buildYseCommonPayDto(YsePayConfigEntity ysePayConfig,String bizContent,
      YseMethodEnum yseMethod) {
    YsePayCommonDTO ysePayCommonDTO = new YsePayCommonDTO();
    ysePayCommonDTO.setMethod(ysePayConfig.getMethod());
    ysePayCommonDTO.setPartnerId(ysePayConfig.getPartnerId());
    ysePayCommonDTO.setCharset("utf-8");
    ysePayCommonDTO.setSignType("RSA");
    ysePayCommonDTO.setVersion(yseMethod.getVersion());
    ysePayCommonDTO.setTimestamp(DateUtil.now());
    ysePayCommonDTO.setNotifyUrl(ysePayConfig.getNotifyUrl());
    ysePayCommonDTO.setBizContent(bizContent);
    ysePayCommonDTO.setSign(YseUtil.generateSign(ysePayCommonDTO, ysePayCommonDTO.getCharset()));

    return ysePayCommonDTO;
  }
}
